home *** CD-ROM | disk | FTP | other *** search
- /*
- File: SemtIntf.cpp
-
- Contains: Implementation of SemtIntf class.
-
- Owned by: Nick Pilch
-
- Copyright: © 1994 - 1996 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <2> 5/24/96 jpa 1246074: Added a missing SOM_CATCH_ALL.
-
- To Do:
- In Progress:
-
- */
-
-
- #ifndef _EXCEPT_
- #include "Except.h"
- #endif
-
- #ifndef _ODDESUTL_
- #include <ODDesUtl.h>
- #endif
-
- #ifndef SOM_ODOSLToken_xh
- #include "ODOSLTkn.xh"
- #endif
-
- #ifndef SOM_ODAppleEvent_xh
- #include "ODAplEvt.xh"
- #endif
-
- #ifndef _ODREGISTRY_
- #include "ODRgstry.xh"
- #endif
-
- #ifndef _SEUTILS_
- #include <SEUtils.h>
- #endif
-
- #ifndef SOM_ODNameResolver_xh
- #include <NamRslvr.xh>
- #endif
-
- #ifndef SOM_ODSession_xh
- #include <ODSessn.xh>
- #endif
-
- #ifndef _TEMPOBJ_
- #include "TempObj.h"
- #endif
-
- #define VARIABLE_MACROS
- #define AppleTestDrag_SemtIntf_Class_Source
- #include <DragSI.xih>
-
- #pragma segment SemtIntf
-
- //------------------------------------------------------------------------------
- // SemtIntf::InitSemtIntf
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK AppleTestDrag_SemtIntfInitSemtIntf(AppleTestDrag_SemtIntf *somSelf, Environment *ev,
- ODPart* base,
- ODSession* session)
- {
- AppleTestDrag_SemtIntfData *somThis = AppleTestDrag_SemtIntfGetData(somSelf);
- AppleTestDrag_SemtIntfMethodDebug("AppleTestDrag_SemtIntf","AppleTestDrag_SemtIntfInitSemtIntf");
-
- _fSession = session;
-
- SOM_TRY
- somSelf->InitSemanticInterface(ev, base, session);
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // SemtIntf::CallEventHandler
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK AppleTestDrag_SemtIntfCallEventHandler(AppleTestDrag_SemtIntf *somSelf, Environment *ev,
- ODPart* thePart,
- ODAppleEvent* theODAppleEvent,
- ODAppleEvent* reply)
- {
- AppleTestDrag_SemtIntfMethodDebug("AppleTestDrag_SemtIntf","AppleTestDrag_SemtIntfCallEventHandler");
-
- // IF WE ARE CAREFUL TO INITIALIZE OUR AEDESCs (AND AppleEvents, ETC.) TO
- // NULL DESCRIPTORS, THEN WE CAN SAFELY CALL DISPOSAL ROUTINES
- // (AEDisposeDesc, ODDisposeAppleEvent) ON THEM BECAUSE THE DISPOSAL
- // ROUTINES IGMORE NULL DESCRIPTORS.
-
- AppleEvent messageAsAEDesc = NULL_DESCRIPTOR_DEFINITION;
- AppleEvent replyAsAEDesc = NULL_DESCRIPTOR_DEFINITION;
-
- SOM_TRY
- // ODEXTENSION SUBCLASSES MUST CALL THIS METHOD AT THE BEGINNING OF
- // EACH PUBLIC METHOD
- somSelf->CheckValid(ev);
-
- // THIS IMPLEMENTATION IS ONLY A SKELETON. SO WE RETURN
- // errAEEventNotHandled TO LET OPENDOC KNOW THAT WE DON'T HANDLE
- // ANY EVENTS YET.
- THROW(errAEEventNotHandled);
-
- // CREATE AN AppleEvent THAT WE CAN LOOK AT FROM THE ODAppleEvent.
- THROW_IF_ERROR( ODDescToAEDesc(theODAppleEvent, &messageAsAEDesc) );
-
- // GET THE EVENT CLASS AND ID SO THAT WE CAN DECIDE WHAT CODE TO INVOKE.
- AEEventClass eventClass = (AEEventClass)GetSLongAttr(
- &messageAsAEDesc, keyEventClassAttr);
- AEEventID eventID = (AEEventID)GetSLongAttr(
- &messageAsAEDesc, keyEventIDAttr);
-
- /* WE CAN GET OTHER PARAMETERS/ATTRIBUTES OUT OF THE EVENT HERE AND/OR
- DISPATCH NOW TO THE APPROPRIATE CODE, e.g.:
-
- if (eventClass == myEventClass && eventID == myDoSomethingEventID)
- CallMyDoSomethingProc(...);
- else if (eventClass == myEventClass
- && eventID == myDoSomethingElseEventID)
- CallMyDoSomethingElseProc(...);
- else
- THROW(errAEEventNotHandled);
- */
-
- // IF WE NEED TO PLACE THINGS IN THE REPLY PARAMETER, WE NEED TO GET
- // AN AppleEvent FROM THE ODAppleEvent IN ORDER TO BE ABLE TO USE
- // AEPutParamPtr, ETC.
- THROW_IF_ERROR( ODDescToAEDesc(reply, &replyAsAEDesc) );
-
- // IF WE HAVE PUT SOMETHING INTO THE REPLY AppleEvent, WE NEED TO PUT
- // THIS INFO BACK INTO THE ODAppleEvent
- THROW_IF_ERROR( AEDescToODDesc(&replyAsAEDesc, reply) );
-
- // DISPOSE OUR LOCAL COPIES OF THESE AppleEvents. THIS IS VERY IMPORTANT.
- // THESE THINGS ARE BIG! YOU DON'T WANT TO LEAK THESE. WE USE THE
- // UTILITY ODDisposeAppleEvent SINCE THESE APPLE EVENTS WILL SOMETIMES
- // APPEAR "LIVE" TO THE APPLE EVENT MANAGER AND IT WILL REFUSE TO
- // DISPOSE THEM. ODDisposeAppleEvent TAKES CARE OF THIS.
- ODDisposeAppleEvent(&replyAsAEDesc);
- ODDisposeAppleEvent(&messageAsAEDesc);
- SOM_CATCH_ALL
- ODDisposeAppleEvent(&replyAsAEDesc);
- ODDisposeAppleEvent(&messageAsAEDesc);
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // SemtIntf::CallCoercionHandler
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK AppleTestDrag_SemtIntfCallCoercionHandler(AppleTestDrag_SemtIntf *somSelf, Environment *ev,
- ODPart* thePart,
- ODDesc* theODDesc,
- ODDescType toType,
- ODDesc* result)
- {
- AppleTestDrag_SemtIntfData *somThis = AppleTestDrag_SemtIntfGetData(somSelf);
- AppleTestDrag_SemtIntfMethodDebug("AppleTestDrag_SemtIntf","AppleTestDrag_SemtIntfCallCoercionHandler");
-
- SOM_TRY
- somSelf->CheckValid(ev);
-
- // THIS IMPLEMENTATION IS ONLY A SKELETON. SO WE RETURN
- // errAEEventNotHandled TO LET OPENDOC KNOW THAT WE DON'T HANDLE
- // ANY COERCIONS YET.
- THROW(errAECoercionFail);
-
- // CONVERT ODDesc INPUT INTO AEDesc
- AEDesc inDescAsAEDesc;
- THROW_IF_ERROR( ODDescToAEDesc(theODDesc, &inDescAsAEDesc));
- // PROTECT AEDesc WITH A TEMP OBJECT.
- TempAEDesc tmpDesc1(&inDescAsAEDesc);
-
- // DO YOUR COERCION HERE. CHECK inDescAsAEDesc.descriptorType TO SEE IF
- // YOU CAN/WANT TO HANDLE THE TYPE.
-
- // CREATE OUTPUT AEDesc
- AEDesc outDesc = NULL_DESCRIPTOR_DEFINITION;
- TempAEDesc tmpDesc2(&outDesc);
-
- // PLACE DATA INTO OUTPUT AEDesc
-
- // PUT OUTPUT AEDesc INTO THE ODDesc
- THROW_IF_ERROR( AEDescToODDesc( &outDesc, result ));
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // SemtIntf::CallObjectAccessor
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK AppleTestDrag_SemtIntfCallObjectAccessor(AppleTestDrag_SemtIntf *somSelf, Environment *ev,
- ODPart* thePart,
- ODDescType desiredClass,
- ODOSLToken* container,
- ODDescType containerClass,
- ODDescType form,
- ODDesc* selectionData,
- ODOSLToken* value)
- {
- AppleTestDrag_SemtIntfData *somThis = AppleTestDrag_SemtIntfGetData(somSelf);
- AppleTestDrag_SemtIntfMethodDebug("AppleTestDrag_SemtIntf","AppleTestDrag_SemtIntfCallObjectAccessor");
-
- SOM_TRY
- somSelf->CheckValid(ev);
-
- // THIS IMPLEMENTATION IS ONLY A SKELETON. SO WE RETURN
- // errAEEventNotHandled TO LET OPENDOC KNOW THAT WE DON'T HANDLE
- // ANY OBJECT ACCESSES YET.
- THROW(errAEEventNotHandled);
-
- AEDesc containerAEDesc = NULL_DESCRIPTOR_DEFINITION;
- DescType containerType = typeNull;
- ODNameResolver* resolver = _fSession->GetNameResolver(ev);
-
- // GET THE USER TOKEN OUT OF THE CONTAINER
- ODDesc* userTokenWrapper = resolver->GetUserToken(ev, container);
- THROW_IF_ERROR(ODDescToAEDesc(userTokenWrapper, &containerAEDesc ));
- TempAEDesc tempDesc1(&containerAEDesc);
- containerType = containerAEDesc.descriptorType;
-
- AEDesc resultAEDesc = NULL_DESCRIPTOR_DEFINITION;
- TempAEDesc tempDesc2(&resultAEDesc);
-
- // EXAMINE containerType AND desiredClass TO DETERMINE IF YOU WANT TO
- // HANDLE THIS OBJECT ACCESS AND CALL THE APPROPRIATE OBJECT ACCESSING
- // ROUTINE
-
- // PLACE THE RESULT BACK INTO THE ODDesc.
- AEDescToODDesc(&resultAEDesc, userTokenWrapper);
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // SemtIntf::CallCompareProc
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK AppleTestDrag_SemtIntfCallCompareProc(AppleTestDrag_SemtIntf *somSelf, Environment *ev,
- ODPart* thePart,
- ODDescType oper,
- ODOSLToken* obj1,
- ODOSLToken* obj2,
- ODBoolean* result)
- {
- AppleTestDrag_SemtIntfData *somThis = AppleTestDrag_SemtIntfGetData(somSelf);
- AppleTestDrag_SemtIntfMethodDebug("AppleTestDrag_SemtIntf","AppleTestDrag_SemtIntfCallCompareProc");
-
- SOM_TRY
- somSelf->CheckValid(ev);
-
- // THIS IMPLEMENTATION IS ONLY A SKELETON. SO WE RETURN
- // errAEEventNotHandled TO LET OPENDOC KNOW THAT WE DON'T HANDLE
- // ANY OBJECT ACCESSES YET.
- THROW(errAEEventNotHandled);
-
- ODNameResolver* resolver = _fSession->GetNameResolver(ev);
-
- // CHECK TO SEE WHETHER SECOND OBJECT IS A TOKEN OR JUST A DATA
- // DESCRIPTOR.
- ODBoolean isODToken = resolver->IsODToken(ev, obj2);
-
- // DO WHAT YOU HAVE TO DO TO RUN THE COMPARISON.
-
- // MAKE SURE TO SET THE RESULT.
- *result = kODFalse;
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // SemtIntf::CallCountProc
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK AppleTestDrag_SemtIntfCallCountProc(AppleTestDrag_SemtIntf *somSelf, Environment *ev,
- ODPart* thePart,
- ODDescType desiredType,
- ODDescType containerClass,
- ODOSLToken* container,
- ODSLong* result)
- {
- AppleTestDrag_SemtIntfData *somThis = AppleTestDrag_SemtIntfGetData(somSelf);
- AppleTestDrag_SemtIntfMethodDebug("AppleTestDrag_SemtIntf","AppleTestDrag_SemtIntfCallCountProc");
-
- SOM_TRY
- somSelf->CheckValid(ev);
-
- // THIS IMPLEMENTATION IS ONLY A SKELETON. SO WE RETURN
- // errAEEventNotHandled TO LET OPENDOC KNOW THAT WE DON'T HANDLE
- // THIS METHOD YET.
- THROW(errAEEventNotHandled);
-
- // IMPLEMENTATION HERE.
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // SemtIntf::CallDisposeTokenProc
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK AppleTestDrag_SemtIntfCallDisposeTokenProc(AppleTestDrag_SemtIntf *somSelf, Environment *ev,
- ODPart* thePart,
- ODOSLToken* unneededToken)
- {
- AppleTestDrag_SemtIntfData *somThis = AppleTestDrag_SemtIntfGetData(somSelf);
- AppleTestDrag_SemtIntfMethodDebug("AppleTestDrag_SemtIntf","AppleTestDrag_SemtIntfCallDisposeTokenProc");
-
- SOM_TRY
- somSelf->CheckValid(ev);
-
- // THIS IMPLEMENTATION IS ONLY A SKELETON. SO WE RETURN
- // errAEEventNotHandled TO LET OPENDOC KNOW THAT WE DON'T HANDLE
- // THIS METHOD YET.
- THROW(errAEEventNotHandled);
-
- // ONLY HANDLE IF IT IS AN OPENDOC TOKEN. SOMETIMES TOKENS THAT OPENDOC
- // USES INTERNALLY ARE PASSED TO PARTS TO DISPOSE. YOU SHOULD LET
- // OPENDOC DISPOSE THESE.
- ODNameResolver* resolver = _fSession->GetNameResolver(ev);
- if ( resolver->IsODToken( ev, unneededToken ) )
- {
- // GET THE USER TOKEN AND ITS TYPE
- ODDesc* userTokenODDesc = resolver->GetUserToken( ev, unneededToken );
- AEDesc tokenAsAEDesc;
- THROW_IF_ERROR(ODDescToAEDesc(userTokenODDesc, &tokenAsAEDesc ));
- TempAEDesc tempDesc1(&tokenAsAEDesc);
- DescType tokenType = tokenAsAEDesc.descriptorType;
-
- // IF YOU SUPPORT LIST OF TOKENS, YOU SHOULD ITERATE OVER THE LIST
- // AND CALL BACK TO ODNAMERESOLVER::DISPOSETOKEN FOR EACH TOKEN
- if ( tokenType == typeAEList )
- {
- long count;
- THROW_IF_ERROR( AECountItems( &tokenAsAEDesc, &count ) );
-
- for ( ODUShort index = 1; index <= count ; ++index )
- {
- // IF YOU CONVERTED THE CONTAINED TOKENS INTO AEDescs AND
- // THEN PUT THEM INTO AN AEDescList, THEN YOU WILL HAVE
- // TO CONVERT THEM BACK TO ODOSLTokens BEFORE YOU CALL
- // DIPOSETOKEN.
- AEDesc oneToken;
- DescType tokenDescType;
- THROW_IF_ERROR( AEGetNthDesc( &tokenAsAEDesc, index, typeWildCard,
- &tokenDescType, &oneToken ) );
- ODOSLToken* subToken = new ODOSLToken();
- THROW_IF_NULL(subToken);
- subToken->InitODOSLToken(ev);
- THROW_IF_ERROR( AEDescToODDesc( &oneToken, subToken ) );
- (void)AEDisposeDesc( &oneToken );
-
- // MAKE SURE TO CALL OPENDOC TO DISPOSE THE TOKEN.
- TRY
- resolver->DisposeToken( ev, subToken );
- CATCH_ALL
- ENDTRY
- }
- }
- else
- {
- // YOU COULD HANDLE PRIVATE TOKEN TYPES HERE.
- }
- }
-
- // LET OPENDOC DISPOSE unneededToken ITSELF. WE ONLY HANDLED DEALING
- // WITH OUR INTERNAL STRUCTURES. ALTERNATIVELY, YOU CAN delete
- // unneededToken YOURSELF AS WELL. LETTING OPENDOC DO IT MAKES ERROR
- // HANDLING SLIGHTLY EASIER
- THROW(errAEEventNotHandled);
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // SemtIntf::CallGetErrDescProc
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK AppleTestDrag_SemtIntfCallGetErrDescProc(AppleTestDrag_SemtIntf *somSelf, Environment *ev,
- ODPart* thePart,
- ODDesc** errDesc)
- {
- AppleTestDrag_SemtIntfData *somThis = AppleTestDrag_SemtIntfGetData(somSelf);
- AppleTestDrag_SemtIntfMethodDebug("AppleTestDrag_SemtIntf","AppleTestDrag_SemtIntfCallGetErrDescProc");
-
- SOM_TRY
- somSelf->CheckValid(ev);
-
- // THIS IMPLEMENTATION IS ONLY A SKELETON. SO WE RETURN
- // errAEEventNotHandled TO LET OPENDOC KNOW THAT WE DON'T HANDLE
- // THIS METHOD YET.
- THROW(errAEEventNotHandled);
-
- // ALLOCATE AN ODDESC FOR ERROR REPORTING. YOU MUST DELETE THIS ODDESC
- // ONCE THE EVENT IS COMPLETELY PROCESSED.
- *errDesc = new ODDesc;
- (*errDesc)->InitODDesc(ev);
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
-